package rpc.aop;

import org.springframework.beans.factory.FactoryBean;

import java.lang.reflect.Proxy;

public class XiaobaibaiClientProxyFactoryBean<T> implements FactoryBean<T> {

    /**
     * FactoryBean 适用于 Bean 的创建过程比较复杂的场景，比如数据库连接池的创建。
     * 本业务场景使用factoryBean是因为需要返回多个bean对象,并且修改对象类型。
     */

    /**
     * FactoryBean接口,在初始化时如果是普通的bean,就直接获取bean即可。
     * 如果是FactoryBean就获取它创建的那个bean。
     */

    private Class<T> interfaces;

    public XiaobaibaiClientProxyFactoryBean(Class<T> interfaces) {
        this.interfaces = interfaces;
    }

    @Override
    @SuppressWarnings("unchecked")
    public T getObject()  {
        /**
         * 返回对应的接口实现类
         */
        return (T)Proxy.newProxyInstance(interfaces.getClassLoader(),new Class[]{interfaces},
                new XiaobaibaiClientProxy<>(interfaces));
    }

    @Override
    public Class<?> getObjectType() {
        return interfaces;//类型
    }

    @Override
    public boolean isSingleton() {
        return true;//单例
    }
}
